#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QSerialPort>
#include<QSerialPortInfo>
#include <QTimer>
#include <QTcpServer>
#include<QUdpSocket>
#include <QPrinter>

QT_BEGIN_NAMESPACE

// 定义数据结构
struct DataPacket {
    qint16 identifier;  // 0xAABB
    double longitude;   // 经度
    double latitude;    // 纬度
    char reserved;      // 保留位
};

namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
//网口服务端端Tcp
    QTcpServer *server;
//网口客户端Tcp
    QTcpSocket *client;

public slots:
    void newClient_connect();
    void on_readyRead_handler();
    void serdisconnect();




private slots:
//串口
    void on_btncloseoropen_clicked();

    void on_btn_send_clicked();

    void on_SerialData_readyToRead();

    void on_checkBox_senddingshi_clicked(bool checked);

    void on_btnrevclear_clicked();

    void on_btnrevsave_clicked();

    void time_refresh();


    void on_btmhideTab_clicked(bool checked);
//网口服务端Tcp
    void on_btn_Listen_clicked();

    void on_btn_stoplisten_clicked();

    void on_btn_sendser_clicked();

    void on_btn_Lineout_clicked();
//网口客户端Tcp
    void on_btn_connectuser_clicked();

    void Data_From_Server();

    void on_btn_senduser_clicked();

    void on_btn_stopuser_clicked();

    void on_connected();
//Udp
    void on_readyreadUdpuser();

    void on_readyreadUdpserver();

    void on_btn_Udpusersend_clicked();

    void on_btn_Udpserclose_clicked();

    void on_btn_Udpuserclose_clicked();

    void on_btn_Udpsersend_clicked();

    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void preview(QPrinter *printer);

private:
    Ui::Widget *ui;
//串口
    QSerialPort *serialPort;
    int writeCntTotal;
    int readCntTotal;
    QString sendBak;
    bool serialStatus;
    QTimer *timer;
    QString myTime;
    void getSysTim();

//网口Udp
    QUdpSocket *Qudpuser;
    QUdpSocket *Qudpserver;
//数据处理
    // 解析串口数据
    bool parseSerialData(const QString &data, double &longitude, double &latitude);
    // 解析网络数据
    bool parseNetworkData(const QByteArray &data, double &longitude, double &latitude);
    // 组包网络数据
    QByteArray packNetworkData(double longitude, double latitude);
    // 格式化串口发送数据
    QString formatSerialData(double longitude, double latitude);
    // 显示经纬度数据
    void displayData(double longitude, double latitude);
    // 图形显示经纬度
    void plotData(double longitude, double latitude);
    // 保存经纬度数据到文件
    void saveDataToFile(double longitude, double latitude);
    // 加载配置
    void loadConfig();
    // 保存配置
    void saveConfig();
};
#endif // WIDGET_H
